From c35fe47b31230c7f520fd08faa9d4086394e77b0 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 15 Jan 2015 11:12:13 -0800 Subject: [PATCH] Don't lose error traces in manifest parse errors Closes #1174 --- src/cargo/ops/cargo_read_manifest.rs | 8 +++---- src/cargo/util/errors.rs | 10 +++++---- src/cargo/util/toml.rs | 12 ++--------- tests/test_bad_config.rs | 31 ++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/cargo/ops/cargo_read_manifest.rs b/src/cargo/ops/cargo_read_manifest.rs index 9314736d9..3dc1aba68 100644 --- a/src/cargo/ops/cargo_read_manifest.rs +++ b/src/cargo/ops/cargo_read_manifest.rs @@ -4,7 +4,7 @@ use std::io::fs::PathExtensions; use std::io::{self, File, fs}; use core::{Package,Manifest,SourceId}; -use util::{self, CargoResult, human, Config}; +use util::{self, CargoResult, human, Config, ChainError}; use util::important_paths::find_project_manifest_exact; use util::toml::{Layout, project_layout}; @@ -12,9 +12,9 @@ pub fn read_manifest(contents: &[u8], layout: Layout, source_id: &SourceId, config: &Config) -> CargoResult<(Manifest, Vec)> { let root = layout.root.clone(); - util::toml::to_manifest(contents, source_id, layout, config).map_err(|e| { - human(format!("failed to parse manifest at `{:?}`\n{}", - root.join("Cargo.toml"), e)) + util::toml::to_manifest(contents, source_id, layout, config).chain_error(|| { + human(format!("failed to parse manifest at `{:?}`", + root.join("Cargo.toml"))) }) } diff --git a/src/cargo/util/errors.rs b/src/cargo/util/errors.rs index 688b30b1f..6a906aab2 100644 --- a/src/cargo/util/errors.rs +++ b/src/cargo/util/errors.rs @@ -8,9 +8,9 @@ use semver; use rustc_serialize::json; use curl; -use toml::Error as TomlError; -use url; use git2; +use toml; +use url; pub type CargoResult = Result>; @@ -228,8 +228,9 @@ from_error! { json::DecoderError, curl::ErrCode, CliError, - TomlError, + toml::Error, url::ParseError, + toml::DecodeError, } impl FromError> for Box { @@ -243,7 +244,8 @@ impl CargoError for json::DecoderError {} impl CargoError for curl::ErrCode {} impl CargoError for ProcessError {} impl CargoError for CliError {} -impl CargoError for TomlError {} +impl CargoError for toml::Error {} +impl CargoError for toml::DecodeError {} impl CargoError for url::ParseError {} // ============================================================================= diff --git a/src/cargo/util/toml.rs b/src/cargo/util/toml.rs index b7321d46e..7addd794c 100644 --- a/src/cargo/util/toml.rs +++ b/src/cargo/util/toml.rs @@ -104,17 +104,9 @@ pub fn to_manifest(contents: &[u8], })); let root = try!(parse(contents, &manifest)); let mut d = toml::Decoder::new(toml::Value::Table(root)); - let toml_manifest: TomlManifest = match Decodable::decode(&mut d) { - Ok(t) => t, - Err(e) => return Err(human(format!("{} is not a valid \ - manifest\n\n{}", - manifest.display(), e))) - }; + let toml_manifest: TomlManifest = try!(Decodable::decode(&mut d)); - let pair = try!(toml_manifest.to_manifest(source_id, &layout, config).map_err(|err| { - human(format!("{} is not a valid manifest\n\n{}", - manifest.display(), err)) - })); + let pair = try!(toml_manifest.to_manifest(source_id, &layout, config)); let (mut manifest, paths) = pair; match d.toml { Some(ref toml) => add_unused_keys(&mut manifest, toml, "".to_string()), diff --git a/tests/test_bad_config.rs b/tests/test_bad_config.rs index ad179ecd5..3b23fd3ff 100644 --- a/tests/test_bad_config.rs +++ b/tests/test_bad_config.rs @@ -141,3 +141,34 @@ test!(good_cargo_config_jobs { assert_that(foo.cargo_process("build").arg("-v"), execs().with_status(0)); }); + +test!(invalid_global_config { + let foo = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.0.0" + authors = [] + + [dependencies] + foo = "0.1.0" + "#) + .file(".cargo/config", "4") + .file("src/lib.rs", ""); + + assert_that(foo.cargo_process("build").arg("-v"), + execs().with_status(101).with_stderr("\ +failed to parse manifest at `[..]Cargo.toml` + +Caused by: + Couldn't load Cargo configuration + +Caused by: + could not parse TOML configuration in `[..]config` + +Caused by: + could not parse input as TOML +[..]config:2:1 expected `=`, but found eof + +")); +}); -- 2.30.2